import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.ArrayList ;
/**
 * Menu del juego
 * 
 * @author Araujo Lara Zahaira Lorena
 * @author Maria Guadalupe
 * @version Programación Orientada a Objetos  2012
 */
public class Mundo extends World
{
    private boolean teclaA=false;//tecla de validacion ayuda
    private donRamon ramon;
    private chavo cha;//=bjeto de la clase chavo
    private kiko ki;//=bjeto de la clase chavo
    private nono no;//=bjeto de la clase chavo
    private chilindrina chilin;
    private popis pop;
    private Menu juego;//Objeto de la clase menu
    private Menu ayuda;//Objeto de la clase menu
    private Menu creditos;
    private Menu letrero;
    private Menu nivel1;//Objeto que muestra imagen de nivel1
    private Menu nivel2;//Objeto que muestra imagen de nivel2
     private Menu nivel3;//Objeto que muestra imagen de nivel3
    private Menu ayudaImagen;
    private Menu creditoImagen;
     
    private Tiempo tiempochavo;// Objeto de la clase tiempo para el objeto chavo
    private Tiempo tiempodonramon;// Objeto de la clase tiempo para el objeto donRamon
    private Tiempo tiempocong;// Objeto de la clase tiempo  de comgelacion de los jugadores
    private Letrero let;//Letreo para agregar al mundo con mensajes diferentes

    private boolean band=false;//bandera de cambios de botones
    private int opcion=0;//Variable de opcion de menu(jugar,credito,menu)
    private int nivel;//Variable nivel la cual se ira incrementando cada ves terminando nivel
    private boolean bandUso;//Esta variable global se usa para activar o desactivar una opcion de menu si otraesta en uso
    /** Constructor escenario de juego
     * 
    */
    
    public Mundo()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
        super(580, 400, 1);
        nivel=0;
        bandUso=true;
        act();
       
    }
     /**
     * Este metodo valida la opcion de menu seleccionada y  la swichea para poder entrar a juego creditos o ayuda
     * 
     */
    public void act()
    {
      
           switch(opcion)
           {
             case 0:
              menu(bandUso);
             break;
             case 1:
              juego(bandUso);
             break; 
             case 2:
                ayuda(bandUso);
             break;
             case 3:
                creditos(bandUso);
             break;
           }

    }
    /**
     * Este metodo utiliza para inicializar el tipo de nivel de juego.
     *@param bandUso variable para saber si esta en unso esta en false si esta en true no esta en uso 
     * y entra a  el nivel de juego.
     * 
     */
   public void juego(boolean bandUso)
   {
      GreenfootImage imagen;
      if(bandUso==true)
      {
           bandUso=false;
           switch(nivel)
           {
               case 0:
                    nivel1 = new Menu(5);
                    addObject(nivel1, 250, 190);
                    Greenfoot.delay(200);
                    removeObject(nivel1);
                    Nivel1();
               break;
               case 1:
                     nivel2 = new Menu(6);
                    addObject(nivel2, 250, 190);
                    Greenfoot.delay(200);
                    removeObject(nivel2);
                    Nivel2();
               break;
               case 2:
                    nivel3 = new Menu(9);
                    addObject(nivel3, 250, 190);
                    Greenfoot.delay(200);
                    removeObject(nivel3);
                    Nivel3();
            }
        }
     
   }
     /**
      * Este metodo llama a una imagen para mostrar la ayuda del juego y sus controles
      * @param bandUso variable para saber si esta en unso esta en false si esta en true no esta en uso 
     */
    public void ayuda(boolean bandUso)
    {
        if(bandUso==true)
        {  
                bandUso=false;
                ayudaImagen= new Menu(7);
                addObject(ayudaImagen,270,200);
                Greenfoot.delay(200);
                removeObject(ayudaImagen);
                menu(true);
        }
 
    }
      /**
      * Este metodo llama a una imagen para mostrar la informacion de los autores
      * @param bandUso para saber si esta en unso esta en false si esta en true no esta en uso 
     */
    public void creditos(boolean bandUso)
    {
         if(bandUso==true)
        {  
                bandUso=false;
                creditoImagen= new Menu(8);
                addObject(creditoImagen,270,200);
                Greenfoot.delay(200);
                removeObject(creditoImagen);
                menu(true);
        }
    }
     /**
     * Nivel 1 de juego: inicializa todos los objetos en una posicion definida en el mundo.
     */
    public void Nivel1()
    {
        ki = new kiko();
        addObject(ki, 370, 174);
        no = new nono();
        addObject(no, 230, 257);
        cha = new chavo();
        addObject(cha, 51, 367);
        ramon = new donRamon();
        addObject(ramon, 157, 100);
        tiempochavo=new Tiempo(60,1);
        addObject(tiempochavo,100,20);
        tiempodonramon=new Tiempo(30,2);
        addObject(tiempodonramon,400,20);
        tiempocong=new Tiempo(3,3);
        bandUso=false;
        
    }
    /**
     * Nivel 2 de juego: inicializa todos los objetos en una posicion definida en el mundo.
     */
    private void Nivel2()
    {
        ki = new kiko();
        addObject(ki, 370, 174);
        no = new nono();
        addObject(no, 230, 257);
        cha = new chavo();
        addObject(cha, 51, 367);
        ramon = new donRamon();
        addObject(ramon, 157, 100);
        tiempochavo=new Tiempo(60,1);
        addObject(tiempochavo,100,20);
        tiempodonramon=new Tiempo(20,2);
        addObject(tiempodonramon,400,20);
        tiempocong=new Tiempo(3,3);
        chilindrina chilin = new chilindrina();
        addObject(chilin, 552, 100);
       bandUso=false;
       
    }
    /**
     * Nivel 3 de juego: inicializa todos los objetos en una posicion definida en el mundo.
     */
    private void Nivel3()
    {
        ki = new kiko();
        addObject(ki, 370, 174);
        no = new nono();
        addObject(no, 230, 257);
        cha = new chavo();
        addObject(cha, 51, 367);
        ramon = new donRamon();
        addObject(ramon, 157, 100);
        tiempochavo=new Tiempo(60,1);
        addObject(tiempochavo,100,20);
        tiempodonramon=new Tiempo(10,2);
        addObject(tiempodonramon,400,20);
        tiempocong=new Tiempo(3,3);
        chilindrina chilin = new chilindrina();
        addObject(chilin, 552, 100);
        pop = new popis();
        addObject(pop, 300, 100);
       bandUso=false;
       
    }


    /**
     * Regresa el objeto de la clase chavo para utilizarlo en cualquier otra clase
     * @return regresa un objeto de tipo chavo
     */
    public chavo regresaChavo()
    {
        return cha;
    }

    /**
     * Regresa el objeto de la clase donRamon para utilizarlo en cualquier otra clase
     * @return regresa un objeto de la clase donRamon
     */
    public donRamon regresaRamon()
    {
        return ramon;
    }

    /**
     * Regresa el objeto de la clase Tiempo para utilizarlo en cualquier otra clase es el tiempo de congelación cuando un objeto definido choca contra otro
     * @return regresa un objeto de la clase tiempo
     */
    public Tiempo regresaTiempoConge()
    {
        return  tiempocong;
    } 

    /**
     * Regresa el objeto de la clase Tiempo para utilizarlo en cualquier otra clase es el tiempo actual del objeto donRamon
     * @return regresa un objeto de la clase Tiempo
     */
    public Tiempo  regresaTiempoDonramon()
    {
        return  tiempodonramon;
    }

    /**
     * Regresa el objeto de la clase Tiempo para utilizarlo en cualquier otra clase es el tiempo actual del objeto chavo
     * @return regresa un objeto de la clase Tiempo
     */
    public Tiempo regresaTiempoChavo()
    {
        return  tiempochavo;
    }

    /**
     * Regresa el objeto de la clase donRamon para utilizarlo en cualquier otra clase
     * @return regresa un objeto de la clase kiko
     */
    public kiko regresaKiko()
    {
        return ki;
    }

    /**
     * Regresa el objeto de la clase donRamon para utilizarlo en cualquier otra clase
     * @return un objeto de la clase nono
     */
    public nono regresaNono()
    {
        return no;
    }
     /**
     * Regresa el objeto de la clase donRamon para utilizarlo en cualquier otra clase
     * @param  b tipo boleana que actualiza el estado de el metodo
     */
     public  void menu(boolean b)
    { 
        if(b==true)
        {
            GreenfootImage fondo= new GreenfootImage("72777198.png");
            fondo.scale(580,400);
            setBackground(fondo);
            juego = new Menu(1);
            addObject(juego, 107, 283);
            ayuda= new Menu(2);
            addObject(ayuda,278,273);
            creditos= new Menu(3);
            addObject(creditos,478,273);
            letrero= new Menu(4);
            addObject(letrero,200,100);
            bandUso=false;
       }
    }
     /**
     * Este metodo actualiza la opcion de juego
     * @param b variable de opcion de menu
     */
    public void actualizaOpcion(int b)
    {
        opcion=b;
    }
     /**
     *Este metodo actualiza al nivel en elmundo despues de que se llama a el metodo regresaNumNivel()
     *@param n variable donde se almacena el numero de nivel
     */
    public void actualizaNivel(int n)
    {
        nivel=n;
    }
     /**
     *Este metodo actualiza el numero de nivel si gana el jugador
     *@return regresa el numero de nivel actual
     */
    public int regrasaNumNivel()
    {
        return nivel;
    }
     /**
     * Este metodo es llamado por otras clases y se actualiza la bandera de uso de la opcion de menu
     * @param n variable  donde se actualiza la bandera de uso
     */
    public void actualizaActivo(boolean n)
    {
       bandUso=n;
    }
     /**
     * Elimina todos los objetos de el mundo
     */
     public void remove()
    {
        int aux;
        aux=getObjects(null).size();
        Actor a;
        for(int f=0;f<aux;f++)
        {
            a = (Actor) getObjects(null).get(0);
            removeObject(a);  
        }
    }
    
}
